import { put,takeEvery ,call,cps} from 'redux-saga/effects';
import * as actionTypes from './action-types';
function delay(ms) {
  return new Promise(resolve => {
    setTimeout(()=>resolve('hello'), ms);
  });
}
//Node风格的异步函数，最后一个参数是一个回调函数，用来接收错误对象和返回值
function delay2(ms,callback){
  setTimeout(()=>{
    callback(null,'world');
  },ms);
}
function* workerSaga() {
  //yield delay(1000);
  //告诉 sagaMiddleware帮我调用delay方法，并把1000作为参数传给delay方法
  // delay一定要返回一个promise，当前的saga执行会暂停，等此promise完成
  //完成后会把成功的值传递给result,并且把当前的saga继续向下执行
  let result1 = yield call(delay,1000);
  console.log(result1)
  //告诉sagaMiddleware帮我调用delay2这个方法，并把1000作为参数传给delay2方法
  //等delay2完成后，会调用callback回调函数，把错误对象和值传递给callback
  //callback第2个参数就是返回值，赋给result2
  let result2 = yield cps(delay2,1000);
  console.log(result2)
  yield put({
    type: actionTypes.ADD
  });
}

function* rootSaga() {
  //监听每一次向仓库派发的ASYNC_ADD动作，派发之后会开启一个新的子saga运行workerSaga
  //watcherSaga  while true   take fork workerSaga
  yield takeEvery(actionTypes.ASYNC_ADD,workerSaga);
  //takeEvery是非阻塞的调用
  console.log('done')
}
export default rootSaga;